#!/bin/bash

# 脚本名称: gen_offcpu_flamegraph.sh
# 功能: 自动生成系统级 off-CPU 火焰图
# 用法: sudo ./gen_offcpu_flamegraph.sh [采样时间(秒)] [输出文件名]

set -e  # 遇到错误立即退出

# 参数默认值
DURATION=${1:-10}          # 默认采样10秒
OUTPUT_FILE=${2:-offcpu}   # 默认输出文件名

# 依赖检查函数
check_dependencies() {
  # 检查perf是否存在
  if ! command -v perf &> /dev/null; then
    echo "错误: perf 未安装，请先执行以下命令安装:"
    echo "  sudo apt-get install linux-tools-$(uname -r)"
    exit 1
  fi

  # 检查FlameGraph脚本是否存在
  if [ ! -d FlameGraph ]; then
    echo "检测到缺少 FlameGraph 工具，自动下载..."
    git clone --depth 1 https://github.com/brendangregg/FlameGraph.git || {
      echo "错误: 无法克隆 FlameGraph 仓库"
      exit 1
    }
  fi
}

# 主执行函数
generate_flamegraph() {
  echo "开始采样，持续 ${DURATION} 秒..."
  
  # 采样数据
  perf record -e sched:sched_switch -a -g -- sleep $DURATION
  
  # 导出数据
  perf script > perf-sched.out
  
  # 处理堆栈
  FlameGraph/stackcollapse-perf.pl perf-sched.out > folded.out
  
  # 生成火焰图
  echo "生成火焰图: ${OUTPUT_FILE}.svg"
  FlameGraph/flamegraph.pl \
    --color=io \
    --title="Off-CPU Flame Graph (${DURATION}s)" \
    --countname=ms \
    folded.out > "${OUTPUT_FILE}.svg"
  
  # 清理中间文件（可选）
  rm -f perf* *.out
}

# 主流程
main() {
  #check_dependencies
  generate_flamegraph
  echo "完成！使用浏览器打开 ${OUTPUT_FILE}.svg 查看结果"
}

# 执行入口
main "$@"